const dgram = require('dgram');
const os = require('os');

// 目标端口
const TARGET_PORT = 7876;

// 要发送的 UDP 探测数据（可以是任意字符串，建议与目标服务约定）
const UDP_PROBE_MESSAGE = Buffer.from('PING'); // 或 JSON / 二进制协议

// 获取本机局域网 IP 列表
function getLocalIPs() {
  const interfaces = os.networkInterfaces();
  const ips = [];
  for (const name of Object.keys(interfaces)) {
    for (const iface of interfaces[name]) {
      if (iface.family === 'IPv4' && !iface.internal) {
        ips.push(iface.address);
      }
    }
  }
  return ips;
}

// 从本机 IP 推导网段前缀，如 192.168.1
function getIPPrefix(ipAddress) {
  return ipAddress.split('.').slice(0, 3).join('.');
}

// 扫描局域网内哪些 IP 的 7678 端口有设备响应 UDP 请求
async function scanUDPPortInLAN() {
  const localIPs = getLocalIPs();
  console.log('[*] 获取本机局域网 IP 地址列表:', localIPs);
  if (localIPs.length === 0) {
    console.log('[-] 未找到可用的局域网 IPv4 地址');
    return [];
  }

  const myIP = localIPs[1];
  const prefix = getIPPrefix(myIP);
  console.log(`[*] 本机 IP: ${myIP}, 网段前缀: ${prefix}.x`);

  const activeDevices = [];
  const socket = dgram.createSocket('udp4');

  // 监听是否有设备回复（来自任意 IP 的目标端口回应）
  socket.on('message', (msg, rinfo) => {
    console.log(`[+] 收到来自 ${rinfo.address}:${rinfo.port} 的响应:`, msg.toString());
    if (!activeDevices.includes(rinfo.address)) {
      activeDevices.push(rinfo.address);
      console.log(`[✓] 设备 ${rinfo.address} 的 ${TARGET_PORT} 端口有服务响应！`);
    }
  });

  // 绑定一个随机端口，用于接收回复（也可 bind(0)）
  socket.bind(0, () => {
    console.log(`[*] UDP Socket 已绑定，开始扫描网段 ${prefix}.x 的 7678 端口...`);
  });

  // 超时控制：每个 IP 发完探测包后等待一段时间
  const TIMEOUT_MS = 2000;
  const START_IP = 1;
  const END_IP = 254;

  (async () => {
    for (let i = START_IP; i <= END_IP; i++) {
      const targetIP = `${prefix}.${i}`;

      // 跳过本机 IP（可选）
      if (targetIP === myIP) continue;

      try {
        console.log(`[.] 正在探测: ${targetIP}:${TARGET_PORT}`);
        await new Promise((resolve) => {
          // 发送探测包
          socket.send(UDP_PROBE_MESSAGE, TARGET_PORT, targetIP, (err) => {
            if (err) {
              console.log(`[-] 发送到 ${targetIP} 失败:`, err.message);
              resolve();
            } else {
              console.log(`[+] 已发送探测包到 ${targetIP}:${TARGET_PORT}`);
              resolve();
            }
          });

          // 等待一段时间看是否有回复
          setTimeout(() => {
            resolve();
          }, TIMEOUT_MS);
        });
      } catch (err) {
        console.log(`[!] 探测 ${targetIP} 出错:`, err);
      }
    }

    // 扫描完毕，关闭 socket
    setTimeout(() => {
      console.log('[*] UDP 局域网扫描完成');
      console.log('[🔍] 发现以下设备响应了 7678 端口:', activeDevices);
      socket.close();
    }, (END_IP - START_IP + 1) * TIMEOUT_MS + 1000);
  })();

  return activeDevices; // 注意：由于异步，最好通过回调 / 事件 / IPC 返回结果
}

scanUDPPortInLAN()

// 导出方法，供主进程其他地方调用
module.exports = { scanUDPPortInLAN };
